2.1 初始化
1 2 3
| from flask import Flask app = Flask(__name__)
|
Flask实例化只有一个必须指定的参数,即程序主模块或包的名字(也即__name__
)
1 2 3 4
| # 2.2 路由和视图函数 1. **路由**:处理URL和函数之间的关系(URL到Python函数的映射关系)的程序。 ```可通过Flask实例提供的`app.route()`装饰器把函数注册为路由。
|
- 视图函数:像
index()
这样的函数。
2.4 一个完整的程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1> @app.route('/user/<name>') # < >尖括号部门是动态url部分 def user(name): # Flask会将动态部分(也即< >部分)作为参数传入视图函数中 return '<h1>Hello {}!'.format(name) if __name__ == '__main__': app.run(debug=True)
|
2.5 请求-响应
2.5.1 程序与请求上下文
程序上下文
:
请求上下文
:
2.5.2 请求调度
Flask使用app.route()
装饰器或者非装饰器形式的app.add_url_rule()
生成URL和视图函数之间的映射
2.5.3 请求钩子
应用场景:在请求开始时,创建数据库链接或认证用户。(即在处理请求之前或之后,执行某些代码)
Flask提供以下4种钩子:
before_first_request
:注册一个函数,在处理第一个请求之前运行
before_request
:注册一个函数,在每次请求之前运行
after_request
:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
teardown_request
:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行
2.5.4 响应
视图函数返回值可以接受3个参数:响应文本,状态码,一个由header组成的字典。
make_response()
函数可以接受3个参数(和视图函数返回值一样),并返回一个response
对象,此时我们可以在response
对象上调用各种方法,进一步设置响应。
如获得一个response
对象,然后设置cookie
:
1 2 3 4 5 6 7 8 9 10
| from flask import Flask from flask import make_response app = Flask(__name__) @app.route('/') def index(): response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response
|
redirect()
函数用于生成重定向(一种特殊的响应)。
abort
函数用于生产另一种特殊响应,用于处理错误。
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from flask import Flask from flask import redirect from flask import abort app = Flask(__name__) @app.route('/') def index(): return redirect('http://www.example.com') @app.route('/user/<id>') def get_user(id): user = load_user(id) # load_user()用于读取id,不展开写 if not user: abort(404) # 如果id不存在,返回状态吗404 return '<h1>Hello {}</h1>'.format(id)
|
2.6 Flask扩展
可使用flask-script
扩展为Flask程序添加一个命令行解析器,那么就可以自定义很多参数,如监听的host、port等。
实现方式:
1 2 3 4 5 6 7
| from flask.ext.script import Manager # ... manager = Manager(app) if __name__ = '__main__': manager.run()
|
把Flask实例app
作为参数传给Manager()
,初始化实例。
注意:Flask扩展都在flask.ext
命名空间下,而Python3.5之后都直接使用from flask-xxx import xxx
来导入。